import axios from 'axios';
const cache = {
  sendData: {
    count:0,
    ts:0,
  }
}

export default function(config) {
  const { url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send', token, timeout = 5000, maxSendTimesPerMinute = 20 } = config;

  /**
   * 检查缓存时间戳是否是当前分钟, 如果不是则重置缓存
   */
  function _checkCacheTS() {
    // 取秒数
    const ts = Math.floor(Date.now() / 1000);
    // 取整分钟
    const tsMinute = ts - ts % 60;
    if (cache.sendData.ts !== tsMinute) {
      cache.sendData.ts = tsMinute;
      cache.sendData.count = 0;
    }
  }

  /**
   * 获取当前分钟已发送次数
   * @returns {Number} 返回当前分钟已发送次数
   */
  function _getCount() {
    _checkCacheTS();
    return cache.sendData.count;
  }

  /**
   * 当前分钟已发送次数+1
   */
  function _incCount() {
    _checkCacheTS();
    ++cache.sendData.count;
  }

  return {
    /**
     * 推送信息给微信群机器人
     * @param {String} msg 文本内容，最长不超过2048个字节(文本首行会自带发送时间)
     * @param {Array} mentioned userid的列表，提醒群中的指定成员(@某个成员)，@all表示提醒所有人 (数组必须为一维数组)
     * @returns {Boolean} 是否发送成功
     */
    sendMsg: async (msg, mentioned) => {
      // 判断是否超过每分钟最大发送次数, 超过不发送.
      if (_getCount() >= maxSendTimesPerMinute) {
        console.error('推送信息到微信群机器人失败! 原因: 超过每分钟最大发送次数');
        return false;
      }
      try {
        const data = {
          msgtype: 'text',
          text: {
            content: `${msg}`,
          }
        }
        // 如果传递了提醒的userid列表, 则添加
        if (mentioned && Array.isArray(mentioned) && mentioned.length > 0) {
          data.text.mentioned_list = mentioned;
        }
        // 发送请求
        const resp = await axios.post(`${url}?key=${token}`, data, {
          timeout: timeout,
          headers: {
            'Content-Type': 'application/json',
          }
        });
        const responseData = resp.data;
        // 判断是否发送成功
        if (responseData.errcode === 0) {
          _incCount();
          return true;
        } else {
          console.error('推送信息刀微信群机器人失败! 原因: ', responseData.errmsg);
          return false;
        }
      } catch (error) {
        console.error('推送信息刀微信群机器人失败! 原因: ', error.message);
        return false;
      }
    }
  }
}
